home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Python 1.4 / Python 1.4 source / Mac / Lib / macostools.py < prev    next >
Encoding:
Python Source  |  1996-09-16  |  2.7 KB  |  111 lines  |  [TEXT/Pyth]

  1. """macostools - Various utility functions for MacOS.
  2.  
  3. mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src'
  4. copy(src, dst) - Full copy of 'src' to 'dst'
  5. """
  6.  
  7. import macfs
  8. import Res
  9. import os
  10. from MACFS import *
  11. import MacOS
  12. import time
  13. try:
  14.     openrf = MacOS.openrf
  15. except AttributeError:
  16.     # Backward compatability
  17.     openrf = open
  18.  
  19. Error = 'macostools.Error'
  20.  
  21. FSSpecType = type(macfs.FSSpec(':'))
  22.  
  23. BUFSIZ=0x80000        # Copy in 0.5Mb chunks
  24.  
  25. #
  26. # Not guaranteed to be correct or stay correct (Apple doesn't tell you
  27. # how to do this), but it seems to work.
  28. #
  29. def mkalias(src, dst):
  30.     """Create a finder alias"""
  31.     srcfss = macfs.FSSpec(src)
  32.     dstfss = macfs.FSSpec(dst)
  33.     alias = srcfss.NewAlias()
  34.     srcfinfo = srcfss.GetFInfo()
  35.  
  36.     Res.FSpCreateResFile(dstfss, srcfinfo.Creator, srcfinfo.Type, -1)
  37.     h = Res.FSpOpenResFile(dstfss, 3)
  38.     resource = Res.Resource(alias.data)
  39.     resource.AddResource('alis', 0, '')
  40.     Res.CloseResFile(h)
  41.     
  42.     dstfinfo = dstfss.GetFInfo()
  43.     dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag
  44.     dstfss.SetFInfo(dstfinfo)
  45.     
  46. def mkdirs(dst):
  47.     """Make directories leading to 'dst' if they don't exist yet"""
  48.     if dst == '' or os.path.exists(dst):
  49.         return
  50.     head, tail = os.path.split(dst)
  51.     if not ':' in head:
  52.         head = head + ':'
  53.     mkdirs(head)
  54.     os.mkdir(dst, 0777)
  55.     
  56. def touched(dst):
  57.     """Tell the finder a file has changed"""
  58.     file_fss = macfs.FSSpec(dst)
  59.     vRefNum, dirID, name = file_fss.as_tuple()
  60.     dir_fss = macfs.FSSpec((vRefNum, dirID, ''))
  61.     crdate, moddate, bkdate = dir_fss.GetDates()
  62.     now = time.time()
  63.     if now == moddate:
  64.         now = now + 1
  65.     dir_fss.SetDates(crdate, now, bkdate)
  66.     
  67. def copy(src, dst, createpath=0, copydates=1):
  68.     """Copy a file, including finder info, resource fork, etc"""
  69.     if createpath:
  70.         mkdirs(os.path.split(dst)[0])
  71.     srcfss = macfs.FSSpec(src)
  72.     dstfss = macfs.FSSpec(dst)
  73.     
  74.     ifp = open(srcfss.as_pathname(), 'rb')
  75.     ofp = open(dstfss.as_pathname(), 'wb')
  76.     d = ifp.read(BUFSIZ)
  77.     while d:
  78.         ofp.write(d)
  79.         d = ifp.read(BUFSIZ)
  80.     ifp.close()
  81.     ofp.close()
  82.     
  83.     ifp = openrf(srcfss.as_pathname(), '*rb')
  84.     ofp = openrf(dstfss.as_pathname(), '*wb')
  85.     d = ifp.read(BUFSIZ)
  86.     while d:
  87.         ofp.write(d)
  88.         d = ifp.read(BUFSIZ)
  89.     ifp.close()
  90.     ofp.close()
  91.     
  92.     sf = srcfss.GetFInfo()
  93.     df = dstfss.GetFInfo()
  94.     df.Creator, df.Type = sf.Creator, sf.Type
  95.     df.Flags = (sf.Flags & (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias))
  96.     dstfss.SetFInfo(df)
  97.     if copydates:
  98.         crdate, mddate, bkdate = srcfss.GetDates()
  99.         dstfss.SetDates(crdate, mddate, bkdate)
  100.     touched(dstfss)
  101.     
  102. def copytree(src, dst, copydates=1):
  103.     """Copy a complete file tree to a new destination"""
  104.     if os.path.isdir(src):
  105.         mkdirs(dst)
  106.         files = os.listdir(src)
  107.         for f in files:
  108.             copytree(os.path.join(src, f), os.path.join(dst, f), copydates)
  109.     else:
  110.         copy(src, dst, 1, copydates)
  111.